package cn.xyinping.hrm.consumer;

import cn.xyinping.hrm.constans.MQConstans;
import cn.xyinping.hrm.to.EmailTo;
import cn.xyinping.hrm.to.MessageTo;
import cn.xyinping.hrm.to.SMSTo;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import java.util.List;

import static cn.xyinping.hrm.constans.MQConstans.*;

/**
 * @author 27266
 * @desrciption 消息消费:从队列中获取短信消息
 * @date 2021/11/29
 */
@Component
@Slf4j
public class messageConsumer {
    // 监听器，监听队列
    @RabbitListener(queues = NAME_QUEUE_SMS,containerFactory = "rabbitListenerContainerFactory")
    // 发送短信 @Payload 将对象转为json格式
    public void smsConsumer(@Payload SMSTo smsTo, Channel channel, Message message){
        // 1. 拿到手机号和内容
        List<String> phone = smsTo.getPhone();
        // 2. 发送短信
        String phones = StringUtils.join(phone, ",");
        log.info("批量发送短信，号码:{} - 内容：{}",phones ,smsTo.getContent());
        // 3. 保存发送记录到数据库 TODO
        // 4. 手动签收
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送邮件
     * @param emailTo
     * @param channel
     * @param message
     */
    @RabbitListener(queues = NAME_QUEUE_EMAIL,containerFactory = "rabbitListenerContainerFactory")
    // @Payload 将对象转为json格式
    public void smsConsumer(EmailTo emailTo, Channel channel, Message message) {
        // 拿到邮箱
        emailTo.getEmails().forEach(email->{
            // 发送邮件
            log.info("发送邮件，邮箱：{} - 标题：{} - 内容：{}",email ,emailTo.getTitle(),emailTo.getContent());
            // 保存邮件到数据库 TODO
        });
        // 4. 手动签收
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送站内信息
     * @param messageTo
     * @param channel
     * @param message
     */
    @RabbitListener(queues = NAME_QUEUE_MESSAGE,containerFactory = "rabbitListenerContainerFactory")
    // @Payload 将对象转为json格式
    public void smsConsumer(MessageTo messageTo, Channel channel, Message message) {
        // 拿到用户Id
        messageTo.getId().forEach(userId->{
            // 发送消息
            log.info("保存站内信，用户ID：{} - 标题：{} - 内容：{}",userId ,messageTo.getTitle(),messageTo.getContent() );
            // 保存消息到数据库 TODO
        });
        // 4. 手动签收
        try {
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
